package com.qcrud.core;

import com.qcrud.core.datasource.DbType;
import com.qcrud.core.parsing.TableInfo;
import com.qcrud.core.sql.CrudSql;
import com.qcrud.core.sql.OracleSql;
import com.qcrud.core.sql.StandardSql;

import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SqlManager {
    private static final Map<String, SqlMeta> SQL_META_MAP = new ConcurrentHashMap<>();
    private static final Map<Class, TableInfo> TABLE_INFO_MAP = new ConcurrentHashMap<>();

    public static SqlMeta put(String key, SqlMeta sqlMeta) {
        return SQL_META_MAP.put(key, sqlMeta);
    }

    public static SqlMeta get(String key) {
        return SQL_META_MAP.get(key);
    }

    /**
     * 返回一个不可修改的 MdSqlMap
     */
    public static Map<String, SqlMeta> getSqlMetaMap() {
        return Collections.unmodifiableMap(SQL_META_MAP);
    }

    public static TableInfo getTableInfo(Class clazz) {
        TableInfo tableInfo = TABLE_INFO_MAP.get(clazz);
        if (null == tableInfo) {
            tableInfo = TableInfo.parse(clazz);
            TABLE_INFO_MAP.put(clazz, tableInfo);
        }
        return tableInfo;
    }

    /**
     * 初始化 crud sql 生成实现类
     *
     * @param sqlData {@link SqlData}
     * @return {@link CrudSql}
     */
    public static CrudSql initCrudSql(SqlData sqlData) {
        StatementContext ctx = sqlData.getCtx();
        DbType dbType = ctx.getDbType();

        if (dbType == DbType.ORACLE
                || dbType == DbType.ORACLE_12C) {
            return new OracleSql(sqlData);
        }

        // 标准 SQL 生成
        return new StandardSql(sqlData);
    }
}
